/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
#pragma once

namespace JSC {

typedef uintptr_t Bits;

class TinyBloomFilter {
public:
    TinyBloomFilter();

    void add(Bits);
    void add(TinyBloomFilter&);
    bool ruleOut(Bits) const; // True for 0.
    void reset();

private:
    Bits m_bits;
};

inline TinyBloomFilter::TinyBloomFilter()
    : m_bits(0)
{
}

inline void TinyBloomFilter::add(Bits bits)
{
    m_bits |= bits;
}

inline void TinyBloomFilter::add(TinyBloomFilter& other)
{
    m_bits |= other.m_bits;
}

inline bool TinyBloomFilter::ruleOut(Bits bits) const
{
    if (!bits)
        return true;

    if ((bits & m_bits) != bits)
        return true;

    return false;
}

inline void TinyBloomFilter::reset()
{
    m_bits = 0;
}

} // namespace JSC
